BSD socket interface
socket interface の一例。一番有名なソケットだろう。
aka. UNIX socket API
事前の理解の整理wint.icon
基本的には5つ組
↑ TCP 5-tuple に しか 当てはまらない
<family, local-addr, local-port, remote-addr, remote-port>
AF_INET ないし AF_INET6 での話
まず family を指定してソケットを作って、サーバーなら local addr, local port を bind して listen する。 accept したら、 remote addr, remote-port が確定して、あとは別スレッドで処理する。
だから、 bind するときの 192.168.0.1:9999 などのアドレスは、ローカルしか意味をなさないので、選べるのは3種いずれか:
unspecified (0.0.0.0)
loopback (127.0.0.0/16)
NIC (e.g. private range)
プロトコル指定
socket/3 については、通常は最初の 2引数で十分。
たとえば、 domain=AF_INET と type=SOCK_STREAM の時点で protocol が TCP だと確定するので、通常は未指定の protocol=0 にしてデフォルト値で良い。
アドレス指定
サーバー
受け付けアドレス
bind → listen
対向アドレス(クライアントのアドレス)
クライアント
相手アドレス
connect
自分は自動?wint.icon
ref.
ソケット (BSD) - Wikipedia
第 2 章 ソケットインタフェース (ネットワークインタフェース) by Oracle
ソケットの作成 (ネットワークインタフェース)
https://docs.oracle.com/cd/E19455-01/806-2730/6jbu725kj/index.html#sockets-tbl-5
プロトコルファミリ
AF_INET6, AF_UNIX = AF_LOCAL
特定のプロトコルの選択 (ネットワークインタフェース)
通常はデフォルトプロトコルで十分
ローカル名のバインド (ネットワークインタフェース)
アドレスのバインド (ネットワークインタフェース)
https://docs.oracle.com/cd/E19455-01/806-2730/6jbu725km/index.html#sockets-47146
TCP と UDP は、ローカル IP アドレス、ローカルポート番号、外部 IP アドレス、 および外部ポート番号の 4 つを使用してアドレス指定を行います。
TCP では、これらの 4 つの要素は一意でなければなりません。
UDP にはこのような要求はありません。
socket(2) - Linux manual page
Man page of SOCKET (ja)
protocols(5) - Linux manual page
Man page of GETPROTOENT (ja)
Protocol Numbers
/etc/protocols トランスポート・プロトコル一覧 - ServersMan@VPS(CentOS)でお気楽サーバー運営 (^^♪ (忘れっぽいので個人メモ用)
bind(2) - Linux manual page
Man page of BIND (ja)
EADDRINUSE
bind() - ソケットへの名前の結合
アドレスを未指定のままにすることにより、サーバーは、要求の到達先のネットワーク・インターフェースにかかわらず、そのポート用に作成された UDP パケットおよび TCP 接続要求 をすべて受け入れることができます。
EADDRINUSE
#network